/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.controlador;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import otcapp.controlador.jinternalFrame.ABMPersonalPantalla;
import otcapp.controlador.modeloTablas.ModeloTabla;
import otcapp.controlador.modeloTablas.ModeloTablaPersonal;
import otcapp.controlador.modelocombobox.ModeloComboTipoProfesional;
import otcapp.controlador.modelocombobox.ModeloComboZona;
import otcapp.controlador.seguridadDecoradores.FabricaContrladores;
import otcapp.entidades.Personal;
import otcapp.entidades.TipoPersonal;
import otcapp.entidades.Zona;
import otcapp.experto.ExpertoABMPersonal;
import otcapp.experto.ExpertoConsultarPersonal;
import otcapp.experto.excepciones.ABMException;
import otcapp.experto.excepciones.ExpertoConsultarPersonalException;
import otcapp.fabricas.FabricaExpertos;

/**
 *
 * @author diego
 */
public class ABMPersonalControlador implements Controlador {

    private ABMPersonalPantalla pantalla;
    private ExpertoABMPersonal experto;
    private ExpertoConsultarPersonal consultarPersonal;
    private boolean retornoAsignarProfesional;
    private boolean retornoSupervisiones;
    private boolean retornoABMUsuarios;

    public ABMPersonalControlador() {
        pantalla = new ABMPersonalPantalla();
        experto = (ExpertoABMPersonal) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.ABM_PERSONAL);
        consultarPersonal = ((ExpertoConsultarPersonal) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.CONSULTAR_PERSONAL));

        pantalla.getTblPersonal().getSelectionModel().addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent e) {
                seleccionarPersonal();
            }
        });

        pantalla.getBtnGuardar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                guardarPersonal();
            }
        });

        pantalla.getBtnNuevo().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                limpiarPantalla();
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                finalizar();
            }
        });

    }

    public boolean isRetornoAsignarProfesional() {
        return retornoAsignarProfesional;
    }

    public void setRetornoAsignarProfesional(boolean retornoAsignarProfesional) {
        retornoSupervisiones = false;
        this.retornoAsignarProfesional = retornoAsignarProfesional;
    }

    public boolean isRetornoSupervisiones() {
        return retornoSupervisiones;
    }

    public void setRetornoSupervisiones(boolean retornoSupervisiones) {
        retornoAsignarProfesional = false;
        this.retornoSupervisiones = retornoSupervisiones;
    }

    public boolean isRetornoABMUsuarios() {
        return retornoABMUsuarios;
    }

    public void setRetornoABMUsuarios(boolean retornoABMUsuarios) {
        this.retornoABMUsuarios = retornoABMUsuarios;
    }
    

    @Override
    public void iniciar() {
        pantalla.getTblPersonal().setModel(new ModeloTablaPersonal());
        pantalla.getTblPersonal().setAutoCreateRowSorter(true);
        try {
            ((ModeloTablaPersonal) pantalla.getTblPersonal().getModel()).setListaElementos(consultarPersonal.buscarPersonalALL());
        } catch (ExpertoConsultarPersonalException ex) {
            System.out.println(ex);
        }
        iniciarCombos();
        pantalla.setVisible(true);
    }

    public void iniciarCombos() {
        pantalla.getCbxTipo().setModel(new ModeloComboTipoProfesional(experto.buscarTiposPersonal()));
        pantalla.getCbxZona().setModel(new ModeloComboZona(experto.buscarZonas()));
    }

    @Override
    public void finalizar() {
        if (retornoAsignarProfesional) {
            retornoAsignarProfesional = false;
            ((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.ASIGNAR_PROFESIONAL);
        }else if(retornoSupervisiones){
            retornoSupervisiones = false;
            ((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.SUPERVISIONES);
        }else if(retornoABMUsuarios){
            retornoSupervisiones = false;
            ((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.USUARIO);
        }
    }

    @Override
    public Component getPantalla() {
        return pantalla;
    }

    @Override
    public void continuar() {
        limpiarPantalla();
        pantalla.setVisible(true);
    }

    private void limpiarPantalla() {
        pantalla.getTxtApellido().setText("");
        pantalla.getTxtLegajo().setText("");
        pantalla.getTxtNombre().setText("");
        pantalla.getCbxTipo().setSelectedIndex(0);
        pantalla.getCbxZona().setSelectedIndex(0);
    }

    private void seleccionarPersonal() {
        int fila = pantalla.getTblPersonal().getSelectedRow();
        if (fila < 0) {
            return;
        }
        int filaModelo = pantalla.getTblPersonal().convertRowIndexToModel(fila);
        Personal personalSeleccionado = (Personal) ((ModeloTabla) pantalla.getTblPersonal().getModel()).getRow(filaModelo);
        experto.setPersonalSeleccionado(personalSeleccionado);
        mostrarPersonal(personalSeleccionado);
    }

    private void mostrarPersonal(Personal personal) {
        pantalla.getTxtApellido().setText(personal.getApellido());
        pantalla.getTxtLegajo().setText(personal.getLegajo());
        pantalla.getTxtNombre().setText(personal.getNombre());
        pantalla.getCbxTipo().setSelectedItem(personal.getTipoPersonal().getNombreTipo());
        pantalla.getCbxZona().setSelectedItem(personal.getZona().getNombreZona());
    }

    private void guardarPersonal() {
        String nombre = pantalla.getTxtNombre().getText();
        String apellido = pantalla.getTxtApellido().getText();
        String legajo = pantalla.getTxtLegajo().getText();
        TipoPersonal tipo = ((ModeloComboTipoProfesional) pantalla.getCbxTipo().getModel()).getItemSeleccionado();
        Zona zona = ((ModeloComboZona) pantalla.getCbxZona().getModel()).getItemSeleccionado();
        try {
            experto.guardarPersonal(apellido, nombre, legajo, tipo, zona);
        } catch (ABMException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            return;
        }
        JOptionPane.showMessageDialog(pantalla, "Personal Acualizado.", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
        limpiarPantalla();
        try {
            ((ModeloTabla) pantalla.getTblPersonal().getModel()).setListaElementos(consultarPersonal.buscarPersonalALL());
        } catch (ExpertoConsultarPersonalException ex) {
            System.out.println("No hay personal cargado en base de datos");
        }
    }
}
